﻿/*********************************************************************
 * Nombre: XmlWriter.cs
 * Descripción: Clase encargada de mostrar cada nodo en la ventana 
 * principal aplicandole el formato XML.
 * Autor: DRD
 * Modificaciones:
 * ******************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BXPI
{
    public class XmlWriter
    {
        MainWindow VentanaPrincipal;
        int nivelActual = 0;
        List<Inyeccion.nodo> ListaNodos = new List<Inyeccion.nodo>();
        
        /// <summary>
        /// Establece el valor del objeto de la ventana principal
        /// </summary>
        /// <param name="Ventana"></param>
        public XmlWriter(MainWindow Ventana) {
            VentanaPrincipal = Ventana;
            
        }


        /// <summary>
        /// Escribe en la ventana principal el nodo en formato XML
        /// </summary>
        /// <param name="nodo"></param>
        public void escribirNodo(Inyeccion.nodo nodo){
            int nivelAnterior = nivelActual;

            nivelActual = nodo.nivel;
            if (nivelActual < nivelAnterior)
            {
                ImprimirCierre(nivelActual);
            }

            if (nodo.tipo == "raiz"){
                EscribirCabecera();
                VentanaPrincipal.printer("<"+ nodo.nombre);
                if (nodo.atributos.Count > 0){
                    for (int i=0; i<nodo.atributos.Count; i++){
                        VentanaPrincipal.printer(" " + nodo.atributos[i].nombre + "=\"" + nodo.atributos[i].valor + "\"");
                    }
                }
                VentanaPrincipal.printer(">");
                ListaNodos.Add(nodo);
            }else if (nodo.tipo == "elemento"){
                VentanaPrincipal.printer("\n");
                for (int i=0; i<nodo.nivel;i++){
                    VentanaPrincipal.printer("\t");
                }
                VentanaPrincipal.printer("<"+ nodo.nombre);
                if (nodo.atributos.Count > 0){
                    for (int i=0; i<nodo.atributos.Count; i++){
 
                        VentanaPrincipal.printer(" " + nodo.atributos[i].nombre + "=\"" + nodo.atributos[i].valor + "\"");

                    }
                    
                }
                if (nodo.num_hijos > 0)
                {
                    VentanaPrincipal.printer(">");
                    ListaNodos.Add(nodo);
                }
                else {
                    VentanaPrincipal.printer("/>");
                }
            }else if (nodo.tipo == "comment"){
                VentanaPrincipal.printer("\n");
                for (int i=0; i<nodo.nivel;i++){
                    VentanaPrincipal.printer("\t");
                }
                VentanaPrincipal.printer("<!--"+ nodo.valor);
                VentanaPrincipal.printer("-->");

            }else if (nodo.tipo == "text"){
                VentanaPrincipal.printer("\n");
                for (int i=0; i<nodo.nivel;i++){
                    VentanaPrincipal.printer("\t");
                }
                VentanaPrincipal.printer(nodo.valor);
            }else if (nodo.tipo == "pi"){
                VentanaPrincipal.printer("\n");
                for (int i=0; i<nodo.nivel;i++){
                    VentanaPrincipal.printer("\t");
                }
                VentanaPrincipal.printer("<?" + nodo.nombre + " " +nodo.valor + "?>");
            }else if (nodo.tipo == "cabecera"){
                VentanaPrincipal.printer("<!--"+ nodo.valor);
                VentanaPrincipal.printer("-->\n");
            }else if (nodo.tipo == "pie"){
                VentanaPrincipal.printer("\n");
                VentanaPrincipal.printer("<!--"+ nodo.valor);
                VentanaPrincipal.printer("-->\n");
            }


        }

        /// <summary>
        /// Permite mandar mensajes textbox a la ventana principal
        /// </summary>
        /// <param name="mensaje"></param>
        /// <param name="info"></param>
        /// <param name="icono"></param>
        public void mensajesUser(string mensaje, string info, string icono)
        {
            VentanaPrincipal.mensajes(mensaje, info, icono);
        }

        /// <summary>
        /// Imprime el cierre de los nodos cuando corresponde.
        /// </summary>
        /// <param name="nivel"></param>
        public void ImprimirCierre(int nivel) {
            Boolean continuar = true;
            while (continuar)
            {
                VentanaPrincipal.printer("\n");
                for (int i = 0; i < ListaNodos.Last().nivel; i++)
                {
                    VentanaPrincipal.printer("\t");
                }
                VentanaPrincipal.printer("</" + ListaNodos.Last().nombre + ">");
                ListaNodos.Remove(ListaNodos.Last());
                if (ListaNodos.Count() > 0)
                {
                    if (ListaNodos.Last().nivel == nivel)
                    {
                        continuar = true;
                    }
                    else
                    {
                        continuar = false;
                    }
                }
                else {
                    continuar = false;
                }
            }
        }

        /// <summary>
        /// Vacía la lista de cierres cuando se termina la extracción
        /// </summary>
        public void TerminarImpresion() {
            while (ListaNodos.Count != 0) {
                ImprimirCierre(-1);
            }
            ListaNodos = new List<Inyeccion.nodo>();
            nivelActual = 0;
           
        }

        /// <summary>
        /// Escribe la declaración por defecto del documento.
        /// </summary>
        public void EscribirCabecera() {
            VentanaPrincipal.printer("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n");
        }
    }
}
